The SERCOM device is a tool established in the CPU that allows to transmit and receive data via serial communication ports. The received data are stored in a buffer of adjustable size. Also receiving can be adjusted automatically by the application of the XON-XOFF protocol. To transmit data using fixed memory area formed by 64 byte. Since that receive and send buffers are different, you can create a shortcut both Half-Duplex and Full-Duplex links.
Using the capabilities of the low level of this device you can implement in your QCL code the highest level communication protocol allowing serial communication with different equipment (example: bar-code reader, linear position sensors with serial data transmission, small printer, ecc.).
Declaration of the used device (internal device): device name assigned, SERCOM, sampling time, serial port, size of receive buffer.
;------------------------------- ;Internal device declaration ;------------------------------- INTDEVICE ... <device_name> SERCOM TCamp serial_port dim_buffer_rx ...
Where:
| INTDEVICE | is a keyword indicating the beginning of the definition of internal devices, |
| <device_name | is the device name, |
| SERCOM | is the keyword that identifies the device described in this document, |
| TCamp | is the sampling time of the device, |
| serial_port | is the definition of the type of serial port connected (0 = Prog, 1 = User, the ID number of the other serial portsdepends on the hardware and firmware of the instrument used). |
| dim_buffer_rx | is the number of bytes to use for the receive circular buffer. If the number is omitted from the X character, or is less than the minimum of 48, It is set to the minimum value. The maximum value allowed is 32000. |
The Declaration of the hardware used in the “BUS” section of the configuration unit you will have to refer to the firmware of the hardware itself.
Example ;------------------------------- ;Internal device declaration ;------------------------------- INTDEVICE ... DevSer SERCOM 0001 0000 0100 ...
The receive and transmit buffers are distinguished, you can then make an Half-Duplex and Full-Duplex connections.
The receive buffer is a memory FIFO type (First Input First Output). The device provides a parameter (ibyte1 ), in response to a command (RECEIVED), the first data received. There is also a parameter that contains the number of received data and in the buffer ( nrx ). With this informations it is easy to write a program in QCL which might “empty” the buffer as arriving data.
The buffer is “circular”: once you run out of space destined to receive subsequent data go to overwrite previously received (if you don't use the XON-XOFF). The latter event is reported in the err parameter.
The receive buffer size can be set in the configuration file at the time of the device declaration. It's important to correctly adjust the receive buffer to prevent the data loss. For example, if a instrument normally broadcasts a 100 characters string and the buffer has a capacity to store 50 characters, or stops the transmission of the string or you lose the data. If the transmitter instrument manages the XON-XOFF protocol the device interrupts its transmission by sending the XOFF character, reactivating the XON character when buffer space is freed.
Il buffer di trasmissione è di dimensione fissa. Esso è composto dalle variabili obyteNN, con NN da 1 a 64. Nel caso della trasmissione è possibile quindi scrivere ogni singolo byte in trasmissione. Con un singolo comando ( SEND ) sarà poi possibile trasferire un messaggio composto da un numero ntx di byte (fino a 64 massimo). Se ciò non fosse sufficiente, è sempre possibile trasmettere più pacchetti consecutivi in modo da completare il messaggio. Lutilizzo di una trasmissione a pacchetti successivi richiede che nel sistema ricevente non siano abilitati i time-out sulla ricezione tra un carattere e il successivo (vedere capitolo Limitazioni).
Il device utilizza un controllo di flusso software, formato dallinvio/ricezione di due caratteri (XOn ed XOff) che permettono
di attivare o bloccare temporaneamente la trasmissione del dispositivo esterno verso il Qmove in modo da consentire
lelaborazione dei dati già ricevuti e lo svuotamento del buffer. Il controllo di flusso può essere abilitato come funzionalità
automatica in modo da evitare il riempimento del buffer di ricezione.
La soglia di XOn e XOff sono fissate rispettivamente dai parametri: xonlim e xofflim.
Il nome del parametro, stato o comando viene riportato alla sinistra della tabella.
R
Indica se il relativo parametro o stato è ritentivo (al momento dellinizializzazione del device mantiene lo stato precedentemente definito), oppure lo stato che assume al momento dellinizializzazione del device.
Se il device non necessita di inizializzazione il campo R indica il valore che il parametro o stato assume allaccensione della scheda.
R = Ritentivo
0 = Al momento dellinizializzazione del device il valore viene forzato a zero.
1 = Al momento dellinizializzazione del device il valore viene forzato a uno.
- = Al momento dellinizializzazione del device viene presentato il valore significativo.
D
Indica la dimensione del parametro.
F = Flag
B = Byte
W = Word
L = Long
S = Single Float
Vengono descritte tutte le condizioni necessarie affinché il parametro sia considerato corretto o perché il comando venga
accettato.
In alcuni casi vengono specificati dei valori limite per laccettazione del parametro: se vengono introdotti dei valori esterni
ai limiti impostati, il dato viene comunque accettato; pertanto devono essere previsti opportuni controlli dellapplicativo tali
da garantire il corretto funzionamento.
Per lesecuzione di un comando, tutte le relative condizioni devono necessariamente essere soddisfatte; in caso contrario
il comando non viene eseguito.
A
Indica la modalità di accesso.
R = Read (lettura).
W = Write (scrittura).
RW = Read / Write.
I comandi a disposizione per gestire il device sono elencati sotto l'ordine di priorità decrescente. Il device esegue tutti i comandi ricevuti entro lo stesso tempo di campionamento iniziando da quello con la priorità maggiore. Per esempio se il device riceve nello stesso tempo di campionamento i comandi CLOSECOM e OPENCOM, per primo esegue il comando OPENCOM e poi quello di CLOSECOM lasciando perciò la porta di comunicazione chiusa.
| Nome | D | R | A | Condizioni | Descrizione |
|---|---|---|---|---|---|
| OPENCOM | / | / | / | st_opencom = 0 | Open Serial communication Apre la comunicazione seriale (il device quindi impegna la porta di comunicazione ). Lo stato st_opencom diventa 1. |
| CLOSECOM | / | / | / | / | Close Serial communication Chiude la comunicazione seriale (il device quindi non impegna piú la porta di comunicazione ). Lo stato st_opencom diventa 0. |
| SEND | / | / | / | ntx > 0 st_opencom = 1 | Send Invia la stringa composta nel buffer di trasmissione per il numero di caratteri impostati nel parametro “ntx”. |
| RECEIVED | / | / | / | ntx > 0 st_opencom = 1 | Received Se nrx > 0, preleva il primo carattere ricevuto e lo pone in ibyte1, quindi decrementa di 1 la variabile nrx. |
| FLUSH | / | / | / | st_opencom = 1 | FLush buffer Esegue un azzeramento della variabile nrx, resetta gli stati st_rxoff e st_txoff e azzera la variabile ibyte1 e tutto il buffer di trasmissione obyte1-64. |
| CLRWDATA | / | / | / | / | Clear Warning Data Azzera la segnalazione del parametro wdata. |
| CLRWCMD | / | / | / | / | Clear Warning Command Azzera la segnalazione del parametro wcmd. |
| Nome | D | R | A | Condizioni | Descrizione |
|---|---|---|---|---|---|
| mode | B | R | RW | - | Mode Definisce il modo di funzionamento del device come: 0 = Normale, senza controllo di flusso 1 = Controllo di flusso software (Xon - Xoff) 2 = Modo speciale per velocizzare l'estrazione dei caratteri dal buffer. Al comando RECEIVED i caratteri ricevuti vengono presentati nei parametri obyte1÷64 invece che nel parametro ibyte. Questo nuovo modo non supporta l'XO-XOFF (quindi riprende il funzionamento del mode 0). Range valido: 0 ÷ 2. N.B.: la modifica del modo di funzionamento, possibile in qualsiasi momento, porta alla reinizializzazione del device con conseguente azzeramento del buffer di ricezione |
| brate | L | R | RW | - | Baud rate Baud rate della seriale. Valori validi: 4800, 9600, 19200, 38400, 57600. |
| datab | B | R | RW | - | Data bit Valori validi: 7, 8 |
| stopb | B | R | RW | - | Stop bit Valori validi: 1, 2 |
| par | B | R | RW | - | Parity (0 ÷ 2) 0 = none (nessuna), 1 = even (pari), 2 = odd (dispari). |
| xonlim | W | R | RW | - | XOn threshold E il valore che identifica la soglia di XOn. Quando il parametro nrx è minore di questa soglia viene inviato un carattere di XON allunità esterna collegata. Il valore di default è 16. Si deve impostare xonlim minore di xofflim. Se non viene soddisfatta questa condizione, viene forzato il valore di default pari a 16. |
| xofflim | W | R | RW | - | XOff threshold E il valore che identifica la soglia di XOff. Quando il parametro nrx è maggiore di questa soglia viene inviato un carattere di XOFF allunità esterna collegata. Il valore di default è 16. Si deve impostare xofflim maggiore di xonlim. Se non viene soddisfatta questa condizione, viene forzato il valore di default pari a dimensione buffer - 16. |
| ntx | W | 0 | RW | - | Number Trasmitted Bytes (1 ÷ 64) E il numero di caratteri da inviare con il comando SEND. |
| nrx | W | 0 | R | - | Number Received Bytes (1 ÷ max.dim. buffer rx) È il numero di caratteri ricevuti dal buffer seriale. |
| ibyte1 | B | 0 | R | - | Rappresenta il buffer di ricezione In seguito al comando RECEIVED in questo parametro viene caricato il primo byte ricevuto estratto dal buffer di ricezione. |
| obyte1÷64 | B | 0 | RW | - | Rappresenta il buffer di trasmissione Output byte n.1÷64. Sono i 64 byte che compongono il buffer di trasmissione. |
| err | - | - | - | - | Errors Indica se sono stati riscontrati errori nel protocollo. 0 = nessun errore 1 = overflow buffer ricezione; indica che sono stati ricevuti più caratteri rispetto alla capienza del buffer. |
| serr | - | - | - | - | Serial Errors Indica se sono stati riscontrati errori nella comunicazione seriale. Il parametro viene aggiornato ad ogni errore rilevato. Il valore permane fino ad un successivo errore o ad una scrittura sullo stesso con il QCL. 0 = nessun errore 1 = parity error 2 = framing error 3 = overrun error |
| st_sended | F | 0 | R | - | Sended L'attivazione indica il completamento della trasmissione di un messaggio. Lo stato viene resettato con il comando SEND. |
| st_rxoff | F | 0 | R | mode = 1 | XOff on receive Se mode = 1 indica che il sistema è in XOff nella ricezione perché il numero di dati contenuti nel buffer di ricezione è sceso al di sotto della soglia di controllo. Viene resettato automaticamente quando viene inviato il carattere di XOn dopo che il buffer di ricezione è stato “svuotato” con il comando RECEIVED fino al rientro nella soglia di controllo, o con il comando FLUSH. |
| st_txoff | F | 0 | R | - | Flow control XOff Se mode = 1 indica che il sistema ha ricevuto il carattere di XOff durante una trasmissione. Viene resettato automaticamente quando viene ricevuto il carattere di XOn o con il comando FLUSH. |
| wdata | F | 0 | R | - | Warning Data Questo bit segnala che è stato tentato un inserimento di un valore non valido in un parametro. |
| wcmd | F | 0 | R | - | Warning Command Questo bit segnala che è non è stato eseguito un comando perchè mancano le condizioni necessarie |
| st_opencom | F | 0 | R | - | Open communication port L'attivazione indica che il device sta impegnando la porta di comunicazione seriale. Per settare questo stato usare il comando OPENCOM, per resettarlo CLOSECOM. |
Di seguito vengono elencate alcune limitazioni sullutilizzo del device SERCOM:
Di seguito uno schema delle combinazioni:
| DataBits | StopBits | ParityBit | |
|---|---|---|---|
| Combinazioni NON Funzionanti | 7 | 1 | 0 |
| 7 | 1 | 1 | |
| 7 | 1 | 2 | |
| 7 | 2 | 0 | |
| 7 | 2 | 1 | |
| 7 | 2 | 2 | |
| 8 | 2 | 0 | |
| 8 | 2 | 1 | |
| 8 | 2 | 2 |
Di seguito si riportano alcuni esempi su come utilizzare il device.
Negli esempi il nome del device sarà DevSer.
Trasmissione di una stringa di controllo in formato ASCII verso uno strumento serie DIN HB237.04A.
La stringa da trasmettere è: {13QL1234561000@
Il codice da scrivere è il seguente:
DevSer:mode = 0
...
address = 13
quota = 123456
...
DevSer:obyte1 = 123 ; carattere {
tmp = address
tmp1 = tmp / 10
DevSer:obyte2 = tmp1 + 48 ; carattere 1
tmp = tmp - (tmp1 * 10)
DevSer:obyte3 = tmp + 48 ; carattere 3
DevSer:obyte4 = 81 ; carattere Q
DevSer:obyte5 = 76 ; carattere L
tmp = quota
tmp1 = tmp / 100000
DevSer:obyte6 = tmp1 + 48 ; carattere 1
tmp = tmp - (tmp1 * 100000)
tmp1 = tmp / 10000
DevSer:obyte7 = tmp1 + 48 ; carattere 2
tmp = tmp - (tmp1 * 10000)
tmp1 = tmp / 1000
DevSer:obyte8 = tmp1 + 48 ; carattere 3
tmp = tmp - (tmp1 * 1000)
tmp1 = tmp / 100
DevSer:obyte9 = tmp1 + 48 ; carattere 4
tmp = tmp - (tmp1 * 100)
tmp1 = tmp / 10
DevSer:obyte10 = tmp1 + 48 ; carattere 5
tmp = tmp - (tmp1 * 10)
DevSer:obyte11 = tmp1 + 48 ; carattere 6
DevSer:obyte12 = 49 ; carattere 1
DevSer:obyte13 = 48 ; carattere 0
DevSer:obyte14 = 48 ; carattere 0
DevSer:obyte15 = 48 ; carattere 0
DevSer:obyte16 = 64 ; carattere @
DevSer:ntx = 16 ; imposta l'invio di 16 caratteri
SEND DevSer ; Invia la stringa
WAIT DevSer:st_sended ; e attendi fine trasmissione
Ricezione di una stringa proveniente da uno strumento HB237.04A in formato ASCII e esecuzione delleco di ogni carattere ricevuto.
La stringa da ricevere è: [13RS123456123456@
Il codice da scrivere è:
DevSer:mode = 0
sequenza = 0
...
WAIT DevSer:nrx ; attendi ricezione carattere
RECEIVED DevSer
DevSer:obyte1 = DevSer:ibyte1 ; esecuzione local echo
DevSer:ntx = 1 ; imposta l'invio di 1 carattere
SEND DevSer ; Invia la stringa
IF sequenza EQ 0
IF DevSer:ibyte1 EQ 91 ; verifica carattere [
indirizzo = 0
sequenza = 1
ENDIF
ENDIF
IF sequenza EQ 1
indirizzo = DevSer:ibyte1 * 10
sequenza = 2
ENDIF
IF sequenza EQ 2
indirizzo = indirizzo + DevSer:ibyte1
IF indirizzo EQ 13 ; verifica valore indirizzo
sequenza = 3
ELSE
sequenza = 0
ENDIF
ENDIF
...
WAIT DevSer:st_sended ; attendi fine trasmissione echo